package com.cs.paoyer.common.util;



import java.util.Properties;
import java.io.FileInputStream;
//import com.cs.paoyer.common.exception.UserException;
import com.cs.paoyer.common.exception.SystemException;
import com.cs.paoyer.common.exception.CommonSystemException;
//import com.cs.paoyer.common.exception.CommonUserException;

public class PropertiesLoader  
{

  // Campo que almacena la �nica instancia disponible para esta clase.
  private static PropertiesLoader singletonInstance = null;

  Properties properties = new Properties();
  private static final String DEFAULT_PROPERTIES_FILE = "application.properties";

  /**
   * Alimenta la clase con la informaci�n de los valores de las llaves almacenadas
   * en un archivo de propiedades.
   *
   */
  private PropertiesLoader() {

    this.refresh("");
  }
  
  /**
   * Devuelve la instancia disponible de esta clase.
   *
   * @return SAAWPropertiesLoader Instancia de la clase.
   */
  public static PropertiesLoader getInstance() {
    if (singletonInstance == null) {
        singletonInstance = new PropertiesLoader();
    }
    return singletonInstance;
  }
  


  /**
   * Devuelve el valor de una variable almacenada en el archivo de propiedades.
   *
   * @param    String         El nombre de la variable a consultar.
   *
   * @return   String         El valor asociado a la variable solicitada por par�metro.
   *
   */
  public String getProperty( String propertyName ) throws SystemException {

    String propertyValue;

    if ( propertyName == null ) {
      throw new SystemException( new CommonSystemException().getModuleVO(),
                                 CommonSystemException.PROPERTY_IS_NULL );
    }

    propertyValue = this.properties.getProperty( propertyName );
    if ( propertyValue == null ) {

      throw new SystemException( new CommonSystemException().getModuleVO(),
                                 CommonSystemException.PROPERTY_NOT_FOUND,null,null,
                                 false );
    }

    return propertyValue;
  }

  /**
   * Carga una nueva lista de propiedades para esta clase, basado en el archivo
   * pasado por par�metro.
   *
   * @param fileName
   */
  public void refresh(String fileName) throws SystemException {
    try {
      properties.clear();
      if ((fileName != null) && (!fileName.equals("")) ) {
        String file = fileName+"/conf/application.properties";
        properties.load(new FileInputStream(fileName));
      } else {
        //Carga el archivo de propiedades por defecto.
        String path = System.getProperty("user.dir")+DEFAULT_PROPERTIES_FILE;
        properties.load(new FileInputStream(DEFAULT_PROPERTIES_FILE));
      }

    } catch (Exception e) {
      System.err.println("Error leyendo archivo de propiedades SAAW. " +
                         e.getMessage());
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSUB - cwsub ********/");
      throw new SystemException(new CommonSystemException().getModuleVO(),
                                CommonSystemException.
                                ERROR_READING_PROPERTIES_FILE, e, null, false);
    }
  }

  /**
   * Carga el archivo de propiedades por defecto.
   */
  public void refresh() throws SystemException 
	{
		  this.refresh("");
  }


  public static void main(String[] args) 
	{
      PropertiesLoader a = PropertiesLoader.getInstance();
      PropertiesLoader b = PropertiesLoader.getInstance();

      if (a==b) {
          //System.out.println("Son referencias del mismo objeto");
      }

  }
}